/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    uart_comm.h
  * @brief   串口通信库头文件
  * @note    提供串口收发功能的接口定义
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef __UART_COMM_H__
#define __UART_COMM_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include <string.h>
#include <stdio.h>

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* USER CODE BEGIN Private defines */

/* 串口接收缓冲区大小 */
#define UART_RX_BUFFER_SIZE    256

/* 串口发送缓冲区大小 */
#define UART_TX_BUFFER_SIZE    256

/* 串口接收超时时间(ms) */
#define UART_RX_TIMEOUT        100

/* 串口发送超时时间(ms) */
#define UART_TX_TIMEOUT        1000

/* USER CODE END Private defines */

/* USER CODE BEGIN Private typedef */

/**
 * @brief 串口接收状态枚举
 */
typedef enum {
    UART_RX_OK = 0,        /* 接收成功 */
    UART_RX_TIMEOUT_ERR,   /* 接收超时 */
    UART_RX_ERROR          /* 接收错误 */
} UART_RX_Status_t;

/**
 * @brief 串口发送状态枚举
 */
typedef enum {
    UART_TX_OK = 0,        /* 发送成功 */
    UART_TX_TIMEOUT_ERR,   /* 发送超时 */
    UART_TX_ERROR          /* 发送错误 */
} UART_TX_Status_t;

/* USER CODE END Private typedef */

/* USER CODE BEGIN Private variables */

/* USER CODE END Private variables */

/* USER CODE BEGIN Private function prototypes */

/* USER CODE END Private function prototypes */

/* USER CODE BEGIN Exported functions */

/**
 * @brief  串口通信初始化
 * @param  None
 * @retval None
 * @note   初始化串口接收缓冲区，启动接收中断
 */
void UART_Comm_Init(void);

/**
 * @brief  串口发送字符串
 * @param  str: 要发送的字符串
 * @retval UART_TX_Status_t: 发送状态
 * @note   阻塞式发送，会等待发送完成
 */
UART_TX_Status_t UART_SendString(const char* str);

/**
 * @brief  串口发送数据
 * @param  data: 要发送的数据指针
 * @param  size: 数据长度
 * @retval UART_TX_Status_t: 发送状态
 * @note   阻塞式发送，会等待发送完成
 */
UART_TX_Status_t UART_SendData(const uint8_t* data, uint16_t size);

/**
 * @brief  串口接收数据
 * @param  data: 接收数据缓冲区指针
 * @param  size: 要接收的数据长度
 * @param  timeout: 接收超时时间(ms)
 * @retval UART_RX_Status_t: 接收状态
 * @note   阻塞式接收，会等待接收完成或超时
 */
UART_RX_Status_t UART_ReceiveData(uint8_t* data, uint16_t size, uint32_t timeout);

/**
 * @brief  串口接收一行数据
 * @param  buffer: 接收缓冲区指针
 * @param  max_size: 缓冲区最大大小
 * @param  timeout: 接收超时时间(ms)
 * @retval UART_RX_Status_t: 接收状态
 * @note   接收直到遇到换行符或超时
 */
UART_RX_Status_t UART_ReceiveLine(char* buffer, uint16_t max_size, uint32_t timeout);

/**
 * @brief  获取接收缓冲区中的数据长度
 * @param  None
 * @retval uint16_t: 缓冲区中的数据长度
 */
uint16_t UART_GetRxDataLength(void);

/**
 * @brief  清空接收缓冲区
 * @param  None
 * @retval None
 * @note   清空接收缓冲区中的所有数据
 */
void UART_ClearRxBuffer(void);

/**
 * @brief  串口发送单个字节
 * @param  byte: 要发送的字节
 * @retval None
 * @note   阻塞式发送，会等待发送完成
 */
void UART_SendByte(uint8_t byte);
 /*
 @param  None
 * @retval None
 */
void UART_ClearTxBuffer(void);

/**
 * @brief  串口接收完成回调函数
 * @param  huart: UART句柄指针
 * @retval None
 * @note   由HAL库自动调用
 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

/**
 * @brief  串口发送完成回调函数
 * @param  huart: UART句柄指针
 * @retval None
 * @note   由HAL库自动调用
 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);

/* USER CODE END Exported functions */

#ifdef __cplusplus
}
#endif

#endif /* __UART_COMM_H__ */
